package com.cc8w.admins.controller;

import com.cc8w.util.VerifyCodeUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Controller
@RequestMapping("/sys/admin")
public class LoginController extends AdminBaseController {

    /**
     * 登录页面
     */
    @RequestMapping("login")
    public String login(){
        /**
         * authc登录拦截器工作原理 (重点：xml过滤链不用排除login)
         * authc拦截器有2个作用：
         * 1>登录认证
         *     请求进来时，拦截并判断当前用户是否登录了，如果已经登录了放行， 如果没有登录，跳转到authc.loginUrl属性配置的路径，注意：默认是/login.jsp
         *
         * 2>执行登录认证
         *     请求进来时，如果请求的路径为authc.loginUrl属性配置的路径（没配置，默认是/login.jsp）时，如果当前用户没有登录，authc这个拦截器会尝试获取请求中的账号跟密码值，然后比对ini配置文件或者realm中的用户列表，如果比对正确，直接执行登录操作，反之，抛异常，跳转到authc.loginUrl指定的路径。
         * 注意：请求中账号与密码必须固定为username 跟password， 如果需要改动必须额外指定，authc.usernameParam=xxx   authc.passwordParam=xxxx
         */


        //如果登录失败从request中获取认证信息，shiroLoginFailure就是shiro异常类的全限定名
        String exceptionClassName = (String) this.request.getAttribute("shiroLoginFailure");
        //根据shiro返回的异常类路径判断，抛出指定异常信息
        if(exceptionClassName!=null){
            //最终会抛出异常处理器
            if(UnknownAccountException.class.getName().equals(exceptionClassName)){
                this.request.setAttribute("errorMsg","账号不存在");
            }else if(IncorrectCredentialsException.class.getName().equals(exceptionClassName)){
                this.request.setAttribute("errorMsg","用户名/密码错误");
            }else{
                this.request.setAttribute("errorMsg","其他异常信息");
            }
        }
        //1.此方法不处理登录成功（认证成功），shiro认证成功会自动跳转到上一个请求路径
        //2.登录失败还到login页面
        //return "forward:/sys/admin/login";
        return "sys/admin/login";
    }

    /**
     * 没有权限
     */
    @RequestMapping("unauthorized")
    public String unauthorized(){

        return "sys/admin/unauthorized";
    }

    /**
     * 登录提交
     */
    @RequestMapping("doLogin")
    public void doLogin(){
        //可以不用了-提交数据全部交由shiro接管

    }
    /**
     * 登出操作
     */
    @RequestMapping("logout")
    public void logout(){
        //可以不用了-交由shiro接管
    }
    /**
     * 验证码
     */
    @RequestMapping("verifycode")
    public void verifyCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //response.setHeader("text/html; charset=UTF-8");
        //禁止图片缓存
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires",0);
        response.setContentType("image/jpeg");

        //生成随机字串
        String verifyCode = VerifyCodeUtils.generateVerifyCode(4);
        //存入会话session
        request.getSession().setAttribute("verify_code", verifyCode.toLowerCase());
        Object vakue = request.getSession().getAttribute("verify_code");
        System.out.println(vakue);


        //生成图片
        int width = 100;//宽
        int height = 40;//高
        VerifyCodeUtils.outputImage(width, height, response.getOutputStream(), verifyCode);
        //参数一：Image类对象 ,参数二：图片格式(非正式),
        //参数三：输出了（也可以是请求响应的response.getOutputStream().write(bytes),这样就输出到页面了）
        //ImageIO.write(verifyCode, "png", response.getOutputStream());

        response.getOutputStream().flush();
        response.getOutputStream().close();


        return;



    }




}
